import os
import pandas as pd
from datetime import datetime


def read_and_combine_excel_files(directory_path, output_csv_path=None, header='auto', sheet_name=0,
                                 skiprows=None, nrows=None, usecols=None, na_values=None,
                                 file_extensions=('xlsx', 'xls'), encoding='utf-8',
                                 include_filename=False, filename_column='filename'):
    """
    读取指定目录下的所有Excel文件并合并成一个DataFrame，然后保存为CSV

    参数:
        directory_path: Excel文件所在目录
        output_csv_path: 输出CSV文件路径，如果为None则自动生成
        header: 'auto'表示自动检测表头，也可以指定为行数
        sheet_name: 要读取的表名或索引
        skiprows: 读取时跳过的行数
        nrows: 读取的行数
        usecols: 要读取的列，可以是列名或列索引
        na_values: 视为NaN的值
        file_extensions: 要处理的文件扩展名
        encoding: 输出CSV的编码
        include_filename: 是否在结果中包含文件名
        filename_column: 如果包含文件名，该列的名称

    返回:
        合并后的DataFrame
    """
    # 检查目录是否存在
    if not os.path.exists(directory_path):
        raise FileNotFoundError(f"指定的目录不存在: {directory_path}")

    # 获取所有符合条件的文件
    excel_files = [f for f in os.listdir(directory_path)
                   if f.lower().endswith(file_extensions)]

    if not excel_files:
        raise FileNotFoundError(f"在目录 {directory_path} 中未找到Excel文件")

    # 如果未指定输出路径，自动生成
    if output_csv_path is None:
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        output_csv_path = os.path.join(directory_path, f"combined_excel_{timestamp}.csv")

    all_data = []
    for file in excel_files:
        file_path = os.path.join(directory_path, file)
        try:
            # 自动检测表头
            if header == 'auto':
                # 先读取前几行来检测表头
                sample = pd.read_excel(file_path, nrows=5, sheet_name=sheet_name)

                # 简单启发式：如果第一行包含至少一个字符串类型的单元格，将其作为表头
                first_row = sample.iloc[0]
                if any(isinstance(cell, str) for cell in first_row):
                    df = pd.read_excel(file_path, header=0, sheet_name=sheet_name,
                                       skiprows=skiprows, nrows=nrows, usecols=usecols,
                                       na_values=na_values)
                else:
                    df = pd.read_excel(file_path, header=None, sheet_name=sheet_name,
                                       skiprows=skiprows, nrows=nrows, usecols=usecols,
                                       na_values=na_values)
            else:
                # 使用指定的表头行
                df = pd.read_excel(file_path, header=header, sheet_name=sheet_name,
                                   skiprows=skiprows, nrows=nrows, usecols=usecols,
                                   na_values=na_values)

            # 如果DataFrame为空则跳过
            if df.empty:
                print(f"警告: 文件 {file} 读取后为空，已跳过")
                continue

            # 添加文件名列
            if include_filename:
                df[filename_column] = file

            all_data.append(df)

            print(f"成功读取文件: {file}, 行数: {len(df)}, 列数: {len(df.columns)}")

        except Exception as e:
            print(f"错误: 无法读取文件 {file}. 错误信息: {str(e)}")

    if not all_data:
        raise ValueError("所有文件都无法读取或为空")

    # 合并所有DataFrame
    combined_df = pd.concat(all_data, ignore_index=True)

    # 保存为CSV
    combined_df.to_csv(output_csv_path, index=False, encoding=encoding)

    print(f"\n合并完成! 输出文件: {output_csv_path}")
    print(f"总行数: {len(combined_df)}")
    print(f"总列数: {len(combined_df.columns)}")

    return combined_df


if __name__ == "__main__":
    # 配置参数
    directory_path = r"D:\家宽\告警\be"  # 要处理的目录
    output_csv_path = None  # 设为None将自动生成文件名

    try:
        # 执行合并
        combined_data = read_and_combine_excel_files(
            directory_path,
            output_csv_path=output_csv_path
        )

        # 打印合并后数据的基本信息
        print("\n数据基本信息:")
        combined_data.info()

    except Exception as e:
        print(f"执行过程中发生错误: {str(e)}")
